# Module 'gwin'
# Fenêtre stdwin générique

# Cette fenêtre sert de classe de base à partir de laquelle les autres types de
# fenêtre sont créés. La fonction mainloop() se charge ici de dispatcher les
# évènements à tous les types de fenêtre.

import stdwin
import stdwinsupport

S = stdwinsupport			# Raccourci

windows = []				# Une liste des fenêtres ouvertes


# Ouvre une fenêtre

def open(title):			# Ouvre une fenêtre générique
	w = stdwin.open(title)
	stdwin.setdefwinsize(0, 0)
	# On définit les gestionnaires d'évènement par défaut
	w.draw = nop
	w.char = nop
	w.mdown = nop
	w.mmove = nop
	w.mup = nop
	w.m2down = m2down
	w.m2up = m2up
	w.size = nop
	w.move = nop
	w.activate = w.deactivate = nop
	w.timer = nop
	# On définit les gestionnaires de commande par défaut
	w.close = close
	w.tab = tab
	w.enter = enter
	w.backspace = backspace
	w.arrow = arrow
	w.kleft = w.kup = w.kright = w.kdown = nop
	windows.append(w)
	return w


# Pour dispatcher les évènements

def mainloop():				# Gère les évènements jusqu'à ce qu'il n'y ait plus
                            # de fenêtre
	while windows:
		treatevent(stdwin.getevent())

def treatevent(e):			# Gère un évènement stdwin
	type, w, detail = e
	if type = S.we_draw:
		w.draw(w, detail)
	elif type = S.we_menu:
		m, item = detail
		m.action[item](w, m, item)
	elif type = S.we_command:
		treatcommand(w, detail)
	elif type = S.we_char:
		w.char(w, detail)
	elif type = S.we_mouse_down:
		if detail[1] > 1: w.m2down(w, detail)
		else: w.mdown(w, detail)
	elif type = S.we_mouse_move:
		w.mmove(w, detail)
	elif type = S.we_mouse_up:
		if detail[1] > 1: w.m2up(w, detail)
		else: w.mup(w, detail)
	elif type = S.we_size:
		w.size(w, w.getwinsize())
	elif type = S.we_activate:
		w.activate(w)
	elif type = S.we_deactivate:
		w.deactivate(w)
	elif type = S.we_move:
		w.move(w)
	elif type = S.we_timer:
		w.timer(w)

def treatcommand(w, type):		# Gère un évènement we_command
	if type = S.wc_close:
		w.close(w)
	elif type = S.wc_return:
		w.enter(w)
	elif type = S.wc_tab:
		w.tab(w)
	elif type = S.wc_backspace:
		w.backspace(w)
	elif type in (S.wc_left, S.wc_up, S.wc_right, S.wc_down):
		w.arrow(w, type)


# Méthodes

def close(w):				# La méthode fermer
	for i in range(len(windows)):
		if windows[i] is w:
			del windows[i]
			break

def arrow(w, detail):			# La méthode pour les touches directionnelles
	if detail = S.wc_left:
		w.kleft(w)
	elif detail = S.wc_up:
		w.kup(w)
	elif detail = S.wc_right:
		w.kright(w)
	elif detail = S.wc_down:
		w.kdown(w)


# Méthodes triviales

def tab(w): w.char(w, '\t')
def enter(w): w.char(w, '\n')		# 'return' est un mot réservé par Python
def backspace(w): w.char(w, '\b')
def m2down(w, detail): w.mdown(w, detail)
def m2up(w, detail): w.mup(w, detail)
def nop(args): pass
